Scripted objects with attachment/pl

Wprowadzenie

Celem tej strony jest pokazanie podstawowego przykładu zastosowania funkcji Dołączenie środowiska Część, przy wykorzystaniu obiektów tworzonych skryptami w środowisku Python.

Zobacz pełny i kompletny minimalny przykład poniżej.

Poniższy GIF demonstruje dołączenie naszego niestandardowego pola do walca i automatyczną aktualizację jego pozycji, gdy zmienia się pozycja walca.

UWAGA: Pudełko jest naszym niestandardowym obiektem skryptowym, a walec jest zwykłym obiektem FreeCAD wygenerowanym w środowisku pracy Część.

Dołączanie obiektów tworzonych skryptami

Dodawanie rozszerzonego dołączania

Najpierw musimy dodać rozszerzenie Part::AttachExtensionPython do naszego obiektu Part::FeaturePython w konstruktorze lub metodzie __init__ naszego niestandardowego obiektu tworzonego skryptem.

class Box():
    """Custom Scripted Box Object"""

    def __init__(self, obj):
        self.Type = 'Box'

        obj.Proxy = self
        
        ... custom properties

        # Needed to make this object "attachable"
        obj.addExtension('Part::AttachExtensionPython')

Bez dodania tego kodu zobaczymy następujące okno dialogowe z ostrzeżeniem podczas dołączania naszego niestandardowego obiektu tworzonego skryptem do innego obiektu.

Aktualizacja pozycji na podstawie dołączonego obiektu

Następnie, w metodzie `execute` naszego niestandardowego obiektu tworzonego skryptem, musimy wywołać `positionBySupport` na naszym obiekcie `Part::FeaturePython`.

class Box:
    
    ...

    def execute(self, obj):
        obj.positionBySupport()
        
        # Assign a Shape to obj
        obj.Shape = Part.makeBox(...)

Bez wywołania positionBySupport, nasz niestandardowy obiekt tworzony skryptem nie zaktualizuje swojej pozycji, gdy zmieni się pozycja dołączonego do niego obiektu.

Pełny i kompletny minimalny przykład

import FreeCAD as App
import Part


class Box():
    """
    Simple Custom Box Object
    See Also:
        https://wiki.freecadweb.org/FeaturePython_Objects
    """

    def __init__(self, obj):
        """
        Constructor
        Arguments
        ---------
        - obj: an existing document object or an object created with FreeCAD.Document.addObject('Part::FeaturePython', '{name}').
        """

        self.Type = 'Box'

        obj.Proxy = self
        obj.addProperty('App::PropertyLength', 'Length',
                        'Dimensions', 'Box length').Length = 10.0
        obj.addProperty('App::PropertyLength', 'Width',
                        'Dimensions', 'Box width').Width = 10.0
        obj.addProperty('App::PropertyLength', 'Height',
                        'Dimensions', 'Box height').Height = 10.0

        # Needed to make this object "attachable",
        # or able to attach parameterically to other objects
        obj.addExtension('Part::AttachExtensionPython')

    def execute(self, obj):
        """
        Called on document recompute
        """
        # Needed to update position when attached-to object changes position.
        # Reposition object based on Support, MapMode and MapPathParameter properties.
        # Returns True if attachment calculation was successful, False if object is not attached and Placement wasn't updated,
        obj.positionBySupport()

        obj.Shape = Part.makeBox(obj.Length, obj.Width, obj.Height)


def create_box(obj_name, document):
    """
    Create a Box.
    """
    obj = document.addObject('Part::FeaturePython', obj_name)
    Box(obj)
    obj.ViewObject.Proxy = 0  # Mandatory unless ViewProvider is coded
    return obj


document = App.ActiveDocument
if document is None:
    document = App.newDocument('Part Attachment Example')

box = create_box('CustomBox', document)
document.recompute()

Bibliografia

=Przetestowano z następującą wersją FreeCAD

Informacje o testowanej wersji FreeCAD:

OS: Ubuntu 18.04.3 LTS
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.18.16146 (Git) AppImage
Build type: Release
Branch: (HEAD detached at 0.18.4)
Hash: 980bf9060e28555fecd9e3462f68ca74007b70f8
Python version: 3.6.7
Qt version: 5.6.2
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: English/UnitedStates (en_US)

Uwaga: Dla FreeCAD 0.19 ten samouczek wymaga drobnej aktualizacji: